--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Commit b172c7fcd40c7b470fa0d5140be4e7f22b89ada8
Parents : 61331b5
Author : Mark Qvist <mark@unsigned.io>
Date : 2024-11-23T12:49:01+01:00
Added PN announce data validation to announce handler
Changes
Diff
diff --git a/LXMF/Handlers.py b/LXMF/Handlers.py
index 5ce5571..7420ea5 100644
--- a/LXMF/Handlers.py
+++ b/LXMF/Handlers.py
@@ -2,8 +2,7 @@ import time
import RNS
import RNS.vendor.umsgpack as msgpack
-from .LXMF import APP_NAME, stamp_cost_from_app_data
-
+from .LXMF import APP_NAME, stamp_cost_from_app_data, pn_announce_data_is_valid
from .LXMessage import LXMessage
class LXMFDeliveryAnnounceHandler:
@@ -40,23 +39,24 @@ class LXMFPropagationAnnounceHandler:
def received_announce(self, destination_hash, announced_identity, app_data):
try:
if type(app_data) == bytes:
- data = msgpack.unpackb(app_data)
-
if self.lxmrouter.propagation_node and self.lxmrouter.autopeer:
- node_timebase = data[1]
- propagation_transfer_limit = None
- if len(data) >= 3:
- try:
- propagation_transfer_limit = float(data[2])
- except:
- propagation_transfer_limit = None
-
- if data[0] == True:
- if RNS.Transport.hops_to(destination_hash) <= self.lxmrouter.autopeer_maxdepth:
- self.lxmrouter.peer(destination_hash, node_timebase, propagation_transfer_limit)
-
- elif data[0] == False:
- self.lxmrouter.unpeer(destination_hash, node_timebase)
+ data = msgpack.unpackb(app_data)
+
+ if pn_announce_data_is_valid(data):
+ node_timebase = data[1]
+ propagation_transfer_limit = None
+ if len(data) >= 3:
+ try:
+ propagation_transfer_limit = float(data[2])
+ except:
+ propagation_transfer_limit = None
+
+ if data[0] == True:
+ if RNS.Transport.hops_to(destination_hash) <= self.lxmrouter.autopeer_maxdepth:
+ self.lxmrouter.peer(destination_hash, node_timebase, propagation_transfer_limit)
+
+ elif data[0] == False:
+ self.lxmrouter.unpeer(destination_hash, node_timebase)
except Exception as e:
RNS.log("Error while evaluating propagation node announce, ignoring announce.", RNS.LOG_DEBUG)
diff --git a/LXMF/LXMF.py b/LXMF/LXMF.py
index c0d3039..184e530 100644
--- a/LXMF/LXMF.py
+++ b/LXMF/LXMF.py
@@ -83,6 +83,7 @@ AM_CUSTOM = 0xFF
# handle and operate on LXMF data in client programs #
##########################################################
+import RNS
import RNS.vendor.umsgpack as msgpack
def display_name_from_app_data(app_data=None):
if app_data == None:
@@ -104,8 +105,8 @@ def display_name_from_app_data(app_data=None):
try:
decoded = dn.decode("utf-8")
return decoded
- except:
- RNS.log("Could not decode display name in included announce data. The contained exception was: {e}", RNS.LOG_ERROR)
+ except Exception as e:
+ RNS.log(f"Could not decode display name in included announce data. The contained exception was: {e}", RNS.LOG_ERROR)
return None
# Original announce format
@@ -127,4 +128,25 @@ def stamp_cost_from_app_data(app_data=None):
# Original announce format
else:
- return None
\ No newline at end of file
+ return None
+
+def pn_announce_data_is_valid(data):
+ try:
+ if type(data) == bytes:
+ data = msgpack.unpackb(data)
+
+ if len(data) < 3:
+ raise ValueError("Invalid announce data: Insufficient peer data")
+ else:
+ if data[0] != True and data[0] != False:
+ raise ValueError("Invalid announce data: Indeterminate propagation node status")
+ try:
+ int(data[1])
+ except:
+ raise ValueError("Invalid announce data: Could not decode peer timebase")
+
+ except Exception as e:
+ RNS.log(f"Could not validate propagation node announce data: {e}", RNS.LOG_DEBUG)
+ return False
+
+ return True
\ No newline at end of file
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────